import axios from 'axios';
import qs from 'qs';

import Router from '@/router/index';
import { MessageBox } from 'element-ui';

// 请求接口
const baseUrl = 'api';

// 拦截器；针对发送请求以前做的处理
axios.interceptors.request.use(
  function (config) {
    // Do something before request is sent
    return config;
  },
  function (error) {
    // Do something with request error
    return Promise.reject(error);
  }
);

// 响应器；请求数据返回以后的处理
axios.interceptors.response.use(
  function (response) {
    const { data } = response;
    if (data.code == 10001) {
      MessageBox.confirm(data.msg + ' 请重新登录', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        showCancelButton: false,
        closeOnClickModal: false,
        closeOnPressEscape: false,
        type: 'warning',
      })
        .then(() => {
          return Router.replace({ name: 'login' });
        })
        .catch(() => {});
    }
    return response;
  },
  function (error) {
    // Do something with response error
    return Promise.reject(error);
  }
);

// 创建一个函数
const request = (param) => {
  const userInfo = localStorage.getItem('userInfo');
  let token = '';
  if (userInfo) {
    token = JSON.parse(userInfo).token;
  }
  // 添加请求头；根据需求配饰即可
  const headers = {
    // 'Accept-Source': 'YnJvd2Vy',
    'HYPERF-SESSION-ID': token, // 登录返回的秘钥
    // 'HYPERF-SESSION-ID': 'QII5jkMMVqIO9l60sQaPlc3YP2g7DgtfhJG7fuKA', // 登录返回的秘钥
    // 'Content-Type': 'application/x-www-form-urlencoded',
  };
  const { url, params } = param;
  let method = param.method || 'GET';
  let data = param.data;

  // 请求方式配置不同的处理
  method = method.toUpperCase(); // 转为大写字母
  if (method == 'POST') {
    data = qs.stringify(data); // 在post中处理数据序列化
  }

  // 同过 Promise 封装一个请求接口
  return new Promise((resolve, reject) => {
    axios({
      url: baseUrl + url,
      method: method,
      data,
      params,
      headers,
    })
      .then((res) => {
        resolve(res.data);
      })
      .catch((err) => {
        reject(err);
      })
      .finally(() => {
        // console.log('不管是否成功都要执行')
      });
  });
};

// 暴露出去
export default request;
